package com.suiwei.advanced.collection;

import java.util.*;
import java.util.function.Consumer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.junit.jupiter.api.Test;

@Slf4j
public class CommonFuncDemo {
    //Collection类通用方法
    @Test
    void CollectionTest(){
        //Collection是接口，多态的形式
        Collection demo = new ArrayList();
        demo.add("张三");//添加
        demo.clear();//清空所有元素
        boolean empty = demo.isEmpty();//判断当前集合是否为空
        boolean remove = demo.remove("张三");//删除指定的元素，返回是否删除成功
        boolean contain = demo.contains("张三");//是否包含指定元素
        int size = demo.size();//集合元素的个数
    }

    //=====================通用遍历方法==========================
    @Test
    void traversalTest(){
        Collection<String> demo = getCollection();
        //1.迭代器
        //迭代：指的是一个过程，其中一系列的操作被重复执行，直到满足某个条件;循环遍历也属于迭代的概念
        Iterator iterator = demo.iterator();//获取集合的迭代器
        while (iterator.hasNext()){ //循环判断集合中是否有元素
            iterator.next(); //next方法会将元素取出，并将指针向后移动一位
        }
        
        //2.增强for循环(iter快捷接)
        //为了简化迭代器的代码书写，内部原理就是一个迭代器
        for (String temp : demo) {
            System.out.println(temp);
        }

        //3.foreach
        //为了简化增强for循环的代码书写（底层是增强for循环-->迭代器）
        // 匿名内部类
        demo.forEach(
                new Consumer<String>() {
                    @Override
                    public void accept(String s) {
                        System.out.println(s);
                    }
                });
        //改成lambda
        demo.forEach(temp -> System.out.println(temp));

        //普通for循环（快捷键fori）
        //并不是通用方法（Collection 接口没有 get(int index) 方法，只有 List 接口才有）
        for(int i = 0; i < demo.size(); i++) {

        }
    }

    //CollectionUtils一般使用apache包下的， 需要在pom文件中引入
    @Test
    void collectionUtilsTest() {
        // 判断是否为空
        log.info(String.valueOf(CollectionUtils.isEmpty(null))); // true
        log.info(String.valueOf(CollectionUtils.isEmpty(new ArrayList()))); // true　　
        // 并集
        String[] arrayA = new String[]{"A", "B", "C"};
        String[] arrayB = new String[]{"B", "C", "D", "D"};
        List<String> listA = Arrays.asList(arrayA);
        List<String> listB = Arrays.asList(arrayB);
        log.info(ArrayUtils.toString(CollectionUtils.union(listA, listB))); // [A, B, C, D, D]
        // 交集
        log.info(ArrayUtils.toString(CollectionUtils.intersection(listA, listB)));
        // 差集
        log.info(ArrayUtils.toString(CollectionUtils.subtract(listA, listB)));
    }


    //===============================基础数据===========================
    Collection<String> getCollection(){
        Collection<String> demo = new ArrayList();
        demo.add("张三");
        demo.add("李四");
        return demo;
    }
}
